Abstract Class vs Interface
An abstract class is best when I have a strong base-type relationship and need to share state, constructors, invariants or implementation. An interface is better when I want to define a capability or contract that unrelated types can implement and I want low coupling. Modern Java and C# interfaces can also contain default implementations, so the distinction is no longer simply 'interface has no implementation'. The design decision should be based on ownership, substitutability, state and extension requirements rather than syntax alone.
Abstract class: useful for shared state and implementation.
Interface: useful for contracts and capabilities.
A class can generally implement multiple interfaces.
A class can extend only one class in Java/C#.
Interfaces are usually preferable for dependency boundaries.
Abstract classes are useful when lifecycle or invariant management belongs in the base class.